package com.yfp.operation.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfp.operation.domain.MarCoupon;
import com.yfp.operation.domain.dto.*;
import com.yfp.operation.domain.vo.PrizeVO;
import com.yfp.operation.domain.dto.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 * @description 针对表【mar_coupon(优惠券)】的数据库操作Mapper
 * @createDate 2024-07-12 15:49:42
 * @Entity domain.com.yfp.operation.MarCoupon
 */
public interface MarCouponMapper extends BaseMapper<MarCoupon> {

    /**
     * 新增
     *
     * @param marCoupon
     */
    void addMarCoupon(MarCoupon marCoupon);

    /**
     * 多条件获取活动列表
     *
     * @param couponQueueVO
     * @return
     */
    List<MarCouponVO> selectMarCoupon(CouponQueueDTO couponQueueVO);

    /**
     * 修改状态
     *
     * @param couponId
     * @param status
     * @param userId
     */
    void updateStatus(@Param("couponId") Long couponId, @Param("status") Integer status, @Param("userId") Long userId);

    /**
     * 修改优惠券剩余数量
     *
     * @param couponId
     * @param surplusCount
     */
    void updateSurplusCount(@Param("couponId") Long couponId, @Param("surplusCount") Integer surplusCount);

    /**
     * 延长时间
     *
     * @param list
     */
    void lengthen(@Param("list") List<MarCoupon> list);
    void lengthenActivityPostponeDay(@Param("list") List<MarCoupon> list);

    /**
     * 批量获取优惠券
     *
     * @param couponIds
     * @return
     */
    List<MarCoupon> getMarCoupon(@Param("couponIds") List<Long> couponIds);

    /**
     * 调用存储过程
     *
     * <pre>{@code
     * CREATE OR REPLACE PROCEDURE "public"."update_mar_coupon_status"()
     *  AS $BODY$
     * DECLARE
     *     r RECORD;
     * BEGIN
     *     FOR r IN SELECT * FROM mar_coupon WHERE "status"=1 and valid_days is NULL LOOP
     *         -- 如果valid_end_time加上postpone_day小于当前时间，更新status
     *         IF add_days_to_timestamp(r.valid_end_time, r.postpone_day) < NOW() THEN
     *             UPDATE mar_coupon
     *             SET status = 3 -- 3表示过期状态
     *             WHERE id = r.id;
     *         END IF;
     *     END LOOP;
     *
     * 		FOR r IN SELECT * FROM mar_coupon WHERE "status"=4 LOOP
     *         -- 如果valid_start_time大于等于当前时间 and 当前时间小于等于valid_end_time加上postpone_day更新status
     *         IF NOW() >= r.valid_start_time and NOW() <= add_days_to_timestamp(r.valid_end_time, r.postpone_day) THEN
     *             UPDATE mar_coupon
     *             SET status = 1 -- 1表示正常状态
     *             WHERE id = r.id;
     *         END IF;
     *     END LOOP;
     * END;
     * $BODY$
     *   LANGUAGE plpgsql
     * }</pre>
     */
    // @Select("call update_mar_coupon_status()")
    void callUpdateMarCouponStatus();

    /**
     * 修改剩余数量
     *
     * @param id
     */
    void editSurplusCount(Long id);

    /**
     * 套餐参与判断
     *
     * @param comboId
     * @return
     */
    Long checkComboParticipation(String comboId);

    /**
     * 修改弹窗图
     *
     * @param img
     * @param marCouponId
     */
    void updatePopupUrl(@Param("img") String img, @Param("marCouponId") Long marCouponId);

    /**
     * 获取礼包优惠券列表
     *
     * @param marCouponPackCouponReqDTO
     * @return
     */
    List<MarCoupon> listByPackCouponReq(MarCouponPackCouponReqDTO marCouponPackCouponReqDTO);

    /**
     * 抽奖奖励列表
     * @param prizeVO
     * @return
     */
    List<PrizeVO> prizeList(PrizeVO prizeVO);

    /**
     * 禁用
     * @param couponId
     */
    void disable(@Param("couponId") Long couponId);

    /**
     * 全国优惠券
     * @param nationwideCouponDTO
     * @return
     */
    List<MarCoupon> nationwideCoupon(NationwideCouponDTO nationwideCouponDTO);

    List<MarCouponVO> groupCouponList(GroupCouponListDTO groupCouponListDTO);

    /**
     * 根据标签和城市名获取优惠券
     * @return
     */
    List<MarCouponVO> getByPositionAndCityName(GroupCouponListDTO groupCouponListDTO);
}




